package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.RoleDao;
import com.itheima.dao.TRoleMenuDao;
import com.itheima.dao.TRolePermissionDao;
import com.itheima.dao.TUserRoleDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Role;
import com.itheima.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 角色管理, 服务层
 */
@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {
    @Autowired
    private RoleDao roleDao;

    @Autowired
    private TRoleMenuDao tRoleMenuDao;

    @Autowired
    private TRolePermissionDao tRolePermissionDao;

    @Autowired
    private TUserRoleDao tUserRoleDao;

    /**
     * 分页查询
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        String queryString = queryPageBean.getQueryString();
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        Page<Role> rolePage = roleDao.findPage(queryString);
        return new PageResult(rolePage.getTotal(), rolePage.getResult());
    }

    /**
     * 新增角色
     * @param menuMessage 角色关联的所有菜单项id
     * @param role
     * @return
     */
    @Override
    public boolean add(Integer[] menuMessage, Role role) {
        //1. 在角色表中插入新增角色, 并且得到插入之后的id
        roleDao.add(role);
        Integer roleId = role.getId();
        //2. 在角色-菜单表中设置 角色,菜单关系
        setRoleMenuRelationship(roleId, menuMessage);
        return true;
    }

    /**
     * 根据角色id 查找角色
     * @param id
     * @return
     */
    @Override
    public Role findById(Integer id) {
        return roleDao.findById(id);
    }

    /**
     * 编辑角色
     * @param menuMessage  该角色关联的所有菜单项id
     * @param role 角色信息
     * @return
     */
    @Override
    public void edit(Integer[] menuMessage, Role role) {
        Integer roleId = role.getId();
        //1. 先在 角色-菜单表 删除原有的关系记录
        tRoleMenuDao.deletRoleMenuRelationshipByRoleId(roleId);
        //2. 编辑角色
        roleDao.edit(role);
        //3. 设置新的角色-菜单关系记录
        setRoleMenuRelationship(roleId, menuMessage);
    }

    /**
     * 根据角色id 删除角色
     * @param roleId
     */
    @Override
    public void delete(Integer roleId) {
        //1. 在 角色-菜单 关系表中删除关系记录
        tRoleMenuDao.deletRoleMenuRelationshipByRoleId(roleId);
        //2. 在 角色-权限 关系表中删除关系记录
        tRolePermissionDao.deleteRelationshipByRoleId(roleId);
        //3. 在 用户-角色 关系表中删除关系记录
        tUserRoleDao.deleteRelationshipByRoleId(roleId);
        //4. 在 角色表 中删除角色
        roleDao.delete(roleId);
    }

    /**
     * 查询所有角色列表
     * @return
     */
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }

    /**
     * 在角色-菜单表中设置 角色,菜单关系
     * @param roleId 角色id
     * @param menuMessage 该角色关联的所有菜单项id
     */
    private void setRoleMenuRelationship(Integer roleId, Integer[] menuMessage) {
        if (menuMessage != null && menuMessage.length > 0) {
            for (Integer menuId : menuMessage) {
                tRoleMenuDao.add(roleId, menuId);
            }
        }
    }
}
